systemd-nspawn lxc podman 容器对比

·

debootstrap 构建vm目录

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo debootstrap --verbose --include=tmux,apt-transport-https,ca-certificates,dbus bookworm /var/lib/machines/debian https://mirrors.ustc.edu.cn/debian
sudo machinectl start debian
sudo machinectl shell debian
# sudo systemd-nspawn -D /var/lib/machines/debian -u root -- /bin/bash -c 'systemctl is-active dbus'
# sudo systemd-nspawn -D /var/lib/machines/debian

podman pull ubuntu:24.04
podman export ubuntu:24.04 > ubuntu.tar
mkdir /var/lib/machines/ubuntu
tar -xf ubuntu.tar -C /var/lib/machines/ubuntu

machinectl start ubuntu
systemd-nspawn -D /var/lib/machines/ubuntu
# 单次运行 / 调试 / 灵活参数控制
# 参数全由用户传递,例如:
# 挂载
# network
# capabilities
# user namespace 等
sudo systemd-nspawn -b -M debian --private-users

配置machine的启动参数

cat <<EOF | sudo tee "/etc/systemd/nspawn/debian.nspawn" >/dev/null
# 安全执行环境
[Exec]
# 启用用户命名空间(关键!容器内 root ≠ 宿主 root)
PrivateUsers=yes
PrivateUsersChown=yes
# 降权:禁止提权,限制能力集
NoNewPrivileges=yes
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_CHOWN CAP_DAC_OVERRIDE CAP_SETGID CAP_SETUID
# 隔离内核模块/参数
PrivateMounts=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
# 文件系统
[Files]
# 只读绑定宿主关键配置
BindReadOnly=/etc/resolv.conf
# 可选:绑定项目目录(取消注释并修改路径)
#Bind=/home/$USER/project:/mnt/project
# 网络(桥接模式)
[Network]
VirtualEthernet=yes
Bridge=$BRIDGE
# 若需MACVLAN(高性能),替换为:
#MACVLAN=$MAIN_IFACE
# 资源控制(cgroup v2)
[ResourceControl]
# CPU:最多 2 核,权重 500
CPUQuota=200%
AllowedCPUs=0 1
# 内存:硬限制 2GB,软限制 1.5GB
MemoryMax=2G
MemoryHigh=1500M
# 进程数上限
TasksMax=500
# IO 权重
IOWeight=500
# 设备安全(仅允许必要设备)
[Device]
# 清空默认允许列表
DeviceAllow=
# 允许终端/随机数
DeviceAllow=char-pts rw
DeviceAllow=char-urandom r
DeviceAllow=char-null r
# 禁止访问磁盘/USB/内核设备
#DeviceAllow=block-* r  # 取消注释可允许磁盘(危险!)
EOF

长期、持久、完整 OS 的开发环境(如:编译内核、部署服务栈、测试系统级软件)

  • 首选 systemd-nspawn
  • 优势:天然持久、systemd 原生、无缝 journal、machinectl 管理方便
# 创建 Ubuntu 开发机
sudo debootstrap jammy /var/lib/machines/dev-ubuntu
sudo systemd-nspawn -D /var/lib/machines/dev-ubuntu --boot
sudo machinectl enable dev-ubuntu

虚拟机中配置网络

# ip route add  default via 192.168.2.1 dev host0
tee -a  /etc/resolv.conf<<EOF
nameserver 223.5.5.5
EOF
# 创建 networkd 配置,为 veth 接口(默认名是 host0)启用 DHCP
cat > /etc/systemd/network/20-wired.network <<'EOF'
[Match]
Name=host0
[Network]
DHCP=yes
# 可选:添加 DNS
# DNS=192.168.1.1
# Domains=lan
EOF
systemctl enable --now systemd-networkd
networkctl status

cat /etc/subuid
pid=$(machinectl show debian -p Leader --value)
cat /proc/$pid/uid_map

使用iso构造rootfs

sudo mount -o loop /path/to/system.iso /mnt/iso
sudo unsquashfs -f -d /var/lib/machines/ubuntu /mnt/iso/casper/minimal.squashfs
sudo machinectl start ubuntu
sudo machinectl shell ubuntu

需要 GUI + 安全 rootless + Docker 镜像生态

  • 首选 Podman(rootless)
  • 优势:一行命令跑 GUI 应用、OCI 镜像丰富、与 Dockerfile 兼容、安全
podman run -d \
  --name devbox \
  --hostname devbox \
  --systemd=always \
  -e DISPLAY=$DISPLAY \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -v ~/project:/home/user/project:z \
  -v dev-data:/var/lib/mysql \
  ghcr.io/linuxserver/code-server:latest

# 通过--rootfs运行:Podman可以直接使用这个解压后的目录来运行容器,这证实了该目录可以作为有效的根文件系统使用:
podman run --rootfs /path/to/lxc/rootfs

需要快照、模板、传统虚拟化体验

  • 选 LXC(或 LXD)
  • 优势:快照/迁移/备份成熟;适合运维人员管理多容器
  • 推荐搭配 lxd(LXC 的 daemon + REST API + CLI 增强版):
lxc launch ubuntu:22.04 dev --profile default --profile gui  # 若配置了 GUI profile